package org.cnam.mobileShopping.view;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;

import org.cnam.mobileShopping.R;
import org.cnam.mobileShopping.bean.MList;
import org.cnam.mobileShopping.bean.User;
import org.cnam.mobileShopping.controller.ListeController;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.util.NotificationUtil;
import org.cnam.mobileShopping.util.PatternUtil;
import org.cnam.mobileShopping.util.SynchroTask;
import org.cnam.mobileShopping.wsclient.WSClient;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

public class ShowList extends Activity {

	/** Le fameux timer qui s'occuper d'aller chercher les synchro à faire */
	private Timer timer;
	/** Et la tâche qui elle ne bougera pas et sera appellée par le timer */
	private SynchroTask task;

	/**
	 * Le handler qui va recevoir la réponse du thread de traitement pour la
	 * connexion
	 */
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// est ce que tout c'est bien passé?
			if (msg.what == 0) {
				// ok maintenant , on va parcourir les listes qui ont été
				// updatées
				String updatedLists = MobileShoppingUtils.getSharedPreferences(
						ShowList.this, "updatedLists");
				// est ce qu'il y en a?
				if (!PatternUtil.isEmpty(updatedLists)) {
					for (String l : updatedLists.split(",")) {
						if (!PatternUtil.isEmpty(l)) {
							// là on récupère la liste en question
							MList list = ListeController.getList(ShowList.this,
									Integer.parseInt(l));
							Intent notificationIntent = new Intent(
									ShowList.this, ShowProductList.class);
							notificationIntent.putExtra("idListe",
									list.getMlistid());
							notificationIntent.putExtra("libelleListe",
									list.getLabel());
							NotificationUtil.launchNotification(
									ShowList.this,
									"Update",
									"Mise à jour de la liste "
											+ list.getLabel(),
									notificationIntent);
							// maintenant il faut enlever cette liste des shared
							// preferences car elle n'est plus à afficher
							String previousList = MobileShoppingUtils
									.getSharedPreferences(ShowList.this,
											"updatedLists");
							previousList.replace("," + list.getMlistid(), "");
							MobileShoppingUtils.addSharedPref(ShowList.this,
									"updatedLists", previousList);
						}
					}
				}
			} else if (msg.what == 1) {
			}
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// affichage de tous les éléments dans le layout
		setContentView(R.layout.showlist);
		// remplissage de la list view
		fillListView();
		// init de la tache de synchro
		task = new SynchroTask(ShowList.this, handler);
		// mise en place du timer qui va checker les synchro
		timer = new Timer();
		// récupération du temps de synchro
		Integer time = Integer.parseInt(MobileShoppingUtils
				.getSharedPreferences(this, "synchroTime", "60"));
		// et on met le scheduler en place (avec le temps en milli)
		timer.scheduleAtFixedRate(task, time * 1000, time * 1000);
	}

	/* Creates the menu items */
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu_liste, menu);
		return true;
	}

	@Override
	protected void onDestroy() {
		super.onStop();
		task.cancel();
		timer.cancel();
		timer.purge();
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle item selection
		switch (item.getItemId()) {
		case R.id.menu_add_list:
			newList();
			return true;
		case R.id.menu_configuration:
			configure();
			return true;
		case R.id.menu_synchronize:
			synchronize();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	/**
	 * Va aller chercher les infos dans la base de données et les afficher dans
	 * la listview
	 */
	private void fillListView() {

		ListView lView = (ListView) findViewById(R.id.listOfListe);
		// la liste qui va contenir toutes les listes de courses que peux voir
		// un utilisateur
		ArrayAdapter<MList> list = new ArrayAdapter<MList>(ShowList.this,
				android.R.layout.simple_list_item_1);

		List<MList> allListe = DAOFactory.getListeDAO(this).findAll();

		for (MList l : allListe) {
			list.add(l);
		}

		lView.setAdapter(list);

		lView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				Intent intent = new Intent(ShowList.this, ShowProductList.class);
				intent.putExtra("idListe", getListe().getItem(position)
						.getMlistid());
				intent.putExtra("libelleListe", getListe().getItem(position)
						.getLabel());
				startActivity(intent);
			}
		});

		// ajout du clic long sur les item de la liste
		lView.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View v,
					final int position, long id) {
				final CharSequence[] items = { "Partager la liste",
						"Supprimer la liste" };

				AlertDialog.Builder builder = new AlertDialog.Builder(
						ShowList.this);
				builder.setTitle(R.string.actions);
				builder.setItems(items, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int item) {

						switch (item) {
						case 0:
							shareList(getListe().getItem(position));
							break;
						case 1:
							// suppression dans la base de données
							ListeController.delete(ShowList.this, getListe()
									.getItem(position));
							// DAOFactory.getListeDAO(ShowList.this).delete(
							// getListe().getItem(position));
							// suppression de la liste dans la liste
							getListe().remove(getListe().getItem(position));
							break;
						default:
							break;
						}
					}
				});
				AlertDialog alert = builder.create();
				alert.show();

				return true;
			}
		});
	}

	private void shareList(final MList list) {

		// ouverture de la dialogue
		final Dialog dialog = new Dialog(ShowList.this);
		dialog.setContentView(R.layout.sharelist);
		dialog.setTitle(R.string.share_title);
		dialog.setCancelable(true);

		dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);
		// on remplis la liste par les comptes mobileshopping disponibles
		List<User> users = new ArrayList<User>();
		try {
			users = WSClient.getInstance().getUsers();
		} catch (Exception e) {
			Log.e("MobileShopping", e.getMessage());
		}
		final Spinner spUsers = (Spinner) dialog.findViewById(R.id.spaccount);
		ArrayAdapter<User> adapterUser = new ArrayAdapter<User>(ShowList.this,
				android.R.layout.simple_spinner_item);
		for (User u : users) {
			adapterUser.add(u);
		}
		spUsers.setAdapter(adapterUser);

		// bouton annuler
		Button buttonCancel = (Button) dialog
				.findViewById(R.id.dialogBtnCancel);
		buttonCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.cancel();
			}
		});
		// bouton share
		Button buttonShare = (Button) dialog.findViewById(R.id.dialogBtnShare);
		buttonShare.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				User selectedUser = (User) spUsers.getSelectedItem();
				try {
					WSClient.getInstance().sharedList(selectedUser.getUserid(),
							list);
					Toast.makeText(
							ShowList.this,
							"Vous venez de partager votre liste avec: "
									+ selectedUser.getPseudo(),
							Toast.LENGTH_LONG).show();
				} catch (Exception e) {
					Log.e("MobileShopping", e.getMessage());
				}

				dialog.cancel();
			}
		});

		// Et on affiche !!
		dialog.show();

	}

	/**
	 * Création d'une nouvelle liste de course
	 */
	private void newList() {
		final AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle(R.string.name_of_list);
		final EditText input = new EditText(this);
		alert.setView(input);
		alert.setPositiveButton(R.string.ok,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						String value = input.getText().toString();
						if (!"".equals(value)) {
							// on créé la nouvelle liste
							MList l = ListeController.createList(ShowList.this,
									value);
							// et dans la liste actuelle
							getListe().add(l);
						} else {
							Toast.makeText(getApplicationContext(),
									R.string.txtNoEmptyLabel, Toast.LENGTH_LONG)
									.show();
						}
					}
				});

		alert.setNegativeButton(R.string.cancel,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						dialog.cancel();
					}
				});
		alert.show();
	}

	/**
	 * Ouverture de la dialog permettant de configurer toute l'application c'est
	 * à dire pouvoir choisir le temps de Sychro, autoriser le mode déconnecté
	 * etc...
	 */
	private void configure() {

		// ouverture de la dialogue
		final Dialog dialog = new Dialog(ShowList.this);
		dialog.setContentView(R.layout.configure);
		dialog.setTitle(R.string.configuration);

		dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);
		// affectation de la valeur par défaut du temps de synchro
		final EditText synchroTime = (EditText) dialog
				.findViewById(R.id.editConfSynchro);
		synchroTime.setText(MobileShoppingUtils.getSharedPreferences(
				ShowList.this, "synchroTime", "60"));
		Button btnOk = (Button) dialog.findViewById(R.id.btnConfOk);
		btnOk.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				try {
					Integer time = Integer.parseInt(synchroTime.getText()
							.toString());
					MobileShoppingUtils.addSharedPref(ShowList.this,
							"synchroTime", time.toString());
					// premièrement on arrête la tache qui peut en cours
					task.cancel();
					task = new SynchroTask(ShowList.this, handler);
					// et on vide complet le timer
					timer.purge();
					timer.cancel();
					timer = new Timer();
					// et on met le scheduler en place (avec le temps en milli)
					timer.scheduleAtFixedRate(task, time * 1000, time * 1000);

				} catch (NumberFormatException e) {
					// seul cas possible, c'est qu'il y ait "" dans la valeur
					// on fait rien...
				} finally {
					dialog.dismiss();
				}
			}
		});
		Button btnCancel = (Button) dialog.findViewById(R.id.btnConfCancel);
		btnCancel.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				dialog.dismiss();
			}
		});
		dialog.show();
	}

	/**
	 * Launche de synchronization with the server in order to retrieve
	 * modifications on user lists
	 */
	private void synchronize() {
		final ProgressDialog dialog = ProgressDialog.show(ShowList.this, "",
				"Synchronisation en cours...", true);
		dialog.show();

		new Thread() {
			@Override
			public void run() {
				if (MobileShoppingUtils.isConnected(ShowList.this)) {
					Integer userId = new Integer(
							MobileShoppingUtils.getSharedPreferences(
									ShowList.this, "userid"));
					String dateUpdate = MobileShoppingUtils
							.getSharedPreferences(ShowList.this, "dateUpdate");

					DAOFactory.getCategoryDAO(ShowList.this).synchronise(
							PatternUtil.formatDate(dateUpdate), userId,
							ShowList.this);
					DAOFactory.getProductDAO(ShowList.this).synchronise(
							PatternUtil.formatDate(dateUpdate), userId,
							ShowList.this);
					DAOFactory.getUserDAO(ShowList.this).synchronise(
							PatternUtil.formatDate(dateUpdate), userId,
							ShowList.this);
					DAOFactory.getListeDAO(ShowList.this).synchronise(
							PatternUtil.formatDate(dateUpdate), userId,
							ShowList.this);
					// et on notifie les mise à jours
					handler.sendEmptyMessage(0);
				}
				// Thread.sleep(2000);
				dialog.cancel();
			}
		}.start();
	}

	/**
	 * Récupération de la liste qui est vue à l'écran
	 * 
	 * @return L'objet liste contenant toutes les listes
	 */
	@SuppressWarnings("unchecked")
	private ArrayAdapter<MList> getListe() {

		ListView lView = (ListView) findViewById(R.id.listOfListe);
		ArrayAdapter<MList> list = (ArrayAdapter<MList>) lView.getAdapter();

		return list;
	}
}
